La concorrenza sul Pianeta Rosso è l'arte di gestire più operazioni indipendenti—come la navigazione dei rover, i dati di telemetria sulla vita e i collegamenti con i satelliti—senza che il sistema si blocchi. In Go, un task in esecuzione indipendente è noto come un goroutine.
1. Il principio della non determinismo
È meglio assumere sempre che le operazioni in diverse goroutine possano essere eseguite in qualsiasi ordine. Poiché il runtime di Go programma le attività su core disponibili, non possiamo contare sul fatto che un rover termini lo scanning prima che un altro inizi la trasmissione senza una sincronizzazione esplicita.
2. Meccanismi di sincronizzazione
Per gestire queste attività, Go fornisce due strumenti principali:
- Esclusione mutua: Le goroutine possono usare un
mutexper escludersi a vicenda dal fare qualcosa nello stesso momento. - L'istruzione Select: Ricorda uno statement switch in cui ogni caso contiene una ricezione o invio su un canale.
selectaspetta fino a quando un caso è pronto e poi lo esegue.
3. Lo scheletro del lavoratore
I lavoratori a lungo termine utilizzano tipicamente un ciclo infinito combinato con select per monitorare simultaneamente più canali di comunicazione:
for {
select {
// Aspetta qui per i canali.
}
}
}